#include <stdio.h>
#include <string.h>
#include <time.h>
#include "esp_netif_sntp.h"
#include "esp_log.h"

#define TAG "sntp_time_drv"

/**
 * @brief 初始化并同步SNTP时间服务
 *
 * @details 该函数完成以下功能：
 *          1. 配置并初始化SNTP客户端，使用阿里云NTP服务器
 *          2. 等待时间同步完成（超时时间10秒）
 *          3. 设置系统时区为中国标准时间（UTC+8）
 *          4. 获取并打印当前本地时间
 *
 * @note 如果10秒内未能完成时间同步，函数将提前返回，并打印错误信息。
 *
 * @return void
 */
void SntpTimeDrvInit(void)
{
    esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG("ntp.aliyun.com");
    esp_netif_sntp_init(&config);
    esp_netif_sntp_start();
    if (esp_netif_sntp_sync_wait(pdMS_TO_TICKS(10000)) != ESP_OK) {
        ESP_LOGE(TAG, "Failed to update system time within 10s timeout");  
        return;      
    }
    time_t now;   
    setenv("TZ", "CST-8", 1);       // 将时区设置为中国标准时间
    tzset();
    struct tm timeinfo;
                                    // struct tm {
                                    //     int tm_sec;   // 秒（0~60，60 用于闰秒）
                                    //     int tm_min;   // 分钟（0~59）
                                    //     int tm_hour;  // 小时（0~23）
                                    //     int tm_mday;  // 月中的第几天（1~31）
                                    //     int tm_mon;   // 月份（0~11，0 代表 1 月，11 代表 12 月）
                                    //     int tm_year;  // 年份（实际年份减去 1900，例如 2025 年存为 125）
                                    //     int tm_wday;  // 星期几（0~6，0 代表星期日，6 代表星期六）
                                    //     int tm_yday;  // 年中的第几天（0~365）
                                    //     int tm_isdst; // 夏令时标志（>0 表示启用，=0 表示未启用，<0 表示未知）
                                    // };

    time(&now);   
    localtime_r(&now, &timeinfo);

    printf("current time: %d-%02d-%02d %02d:%02d:%02d\n",
        timeinfo.tm_year + 1900, // 修正年份
        timeinfo.tm_mon + 1,     // 修正月份
        timeinfo.tm_mday,        // 日（无需修正）
        timeinfo.tm_hour,        // 时
        timeinfo.tm_min,         // 分
        timeinfo.tm_sec);        // 秒
}

/**
 * @brief 获取当前时间的字符串格式
 *
 * 将当前系统时间转换为格式化的字符串,格式为"年月日时分秒"
 * 例如: "20230801143022" 表示 2023年08月1日14时30分22秒
 *
 * @return 返回格式化后的时间字符串,使用静态缓冲区存储
 */
char *GetTimeStrOfSec(void)
{
    time_t now;
    struct tm timeinfo;
    time(&now);
    localtime_r(&now, &timeinfo);
    static char time_str[50];
    snprintf(time_str, sizeof(time_str),"%lu%02lu%02lu%02lu%02lu%02lu", 
                                        (uint32_t)timeinfo.tm_year + 1900, 
                                        (uint32_t)timeinfo.tm_mon + 1, 
                                        (uint32_t)timeinfo.tm_mday,
                                        (uint32_t)timeinfo.tm_hour,
                                        (uint32_t)timeinfo.tm_min,
                                        (uint32_t)timeinfo.tm_sec);
    ESP_LOGI(TAG, "get time str:%s", time_str);
    return time_str;
}
 